// middleware/token_handler.js
module.exports = (options, app) => {
  return async (ctx, next) => {
    // 获取请求头token
    // let { token } = ctx.header;
    let token = ctx.headers["authorization"];
    token = token
      ? token.split("Bearer ")[1] // Bearer token
      : null;
    // console.log(token);
    if (!token) {
      ctx.throw(400, "您没有权限访问该接口!");
    }
    // 根据token解密，换取用户信息
    let user = {};
    try {
      user = app.jwt.verify(token, app.config.jwt.secret);
    } catch (err) {
      let fail =
        err.name === "TokenExpiredError"
          ? "token 已过期! 请重新获取令牌"
          : "Token 令牌不合法!";
      ctx.throw(400, fail);
    }

    // 获取当前用户，验证当前用户是否存在
    user = await app.model.User.findOne({
      where: {
        id: user.id
      },
      include: [
        {
          model: app.model.Role,
          required: true,
          attributes: ["rolename"]
        },
        {
          model: app.model.Member
        }
      ]
    });

    if (!user) {
      ctx.throw(400, "当前用户不存在！");
    }

    // 把 user 信息挂载到全局ctx上
    ctx.tokenUser = user;

    await next();
  };
};
